/*
 * @Author: yuki
 * @Date: 2025-10-26 17:32:40
 * @LastEditTime: 2025-11-04 11:33:08
 * @Description: 守卫类，用于验证 JWT 令牌并判断是否为公开接口
 */
import { Injectable, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core'; // 用于读取元数据
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  constructor(private reflector: Reflector) {
    super();
  }

  // 重写 canActivate 方法，判断是否为公开接口
  canActivate(context: ExecutionContext) {
    // 读取接口是否被标记为 @Public()
    const isPublic = this.reflector.getAllAndOverride<boolean>('isPublic', [
      context.getHandler(), // 检查路由级别
      context.getClass() // 检查控制器级别
    ]);
    // 如果是公开接口，直接允许访问
    if (isPublic) {
      return true;
    }
    // 否则执行默认的 JWT 验证逻辑
    return super.canActivate(context);
  }
}
